package com.woniuxy.goods.controller;


import cn.hutool.core.bean.BeanUtil;
import com.woniuxy.core.annotation.Permission;
import com.woniuxy.core.exception.ParamException;
import com.woniuxy.core.util.Result;
import com.woniuxy.goods.dto.AttrConfigDto;
import com.woniuxy.goods.dto.AttrInfoDto;
import com.woniuxy.goods.form.AddAttrConfigForm;
import com.woniuxy.goods.form.UpdateAttrConfigForm;
import com.woniuxy.goods.param.AddAttrConfigParam;
import com.woniuxy.goods.param.UpdateAttrConfigParam;
import com.woniuxy.goods.service.AttributeConfigService;
import io.swagger.annotations.*;
import jdk.internal.org.objectweb.asm.tree.analysis.Value;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 * 属性组、属性绑定控制层接口
 * @author ...
 * @since 2024年05月25日
 */
@RestController
@Api(tags = "属性组、属性绑定管理接口")
@RequestMapping("/attributeConfig")
public class AttributeConfigController {
    /**
     * 属性配置服务层接口
     */
    @Resource
    private AttributeConfigService attributeConfigService;

    /**
     * 新增属性组、属性绑定
     * @param form 新增属性组属性配置对象
     * @return 属性组属性配置dto对象集合
     * @throws Exception
     */
    @ApiOperation("新增属性组、属性绑定")
    @ApiResponses({
            @ApiResponse(code = 200,message = "OK",response = AttrConfigDto.class)
    })
    @PostMapping("/addAttrConfig")
    @Permission(roles = {"超级管理员","管理员"})
    public Result addAttrConfig(@RequestBody AddAttrConfigForm form)throws Exception{
        List<AttrConfigDto> dtos = attributeConfigService.addAttrConfig(BeanUtil.toBean(form, AddAttrConfigParam.class));
        return Result.success("新增属性组、属性绑定成功",dtos);
    }

    /**
     * 删除属性组、属性绑定
     * @param id 属性组属性绑定信息id
     * @return
     * @throws Exception
     */
    @ApiOperation("删除属性组、属性绑定")
    @ApiImplicitParam("属性组属性绑定信息id")
    @GetMapping("/delAttrConfig")
    @Permission(roles = {"超级管理员","管理员"})
    public Result delAttrConfig(Integer id)throws Exception{
        attributeConfigService.delAttrConfig(id);
        return Result.success("删除属性组、属性绑定成功",null);
    }

    /**
     * 通过属性组id删除属性组、属性绑定
     * @param groupId 属性组id
     * @return
     * @throws Exception
     */
    @ApiOperation("通过属性组id删除属性组、属性绑定")
    @ApiImplicitParam("属性组id")
    @GetMapping("/delConfigByGroupId")
    @Permission(roles = {"超级管理员","管理员"})
    public Result delConfigByGroupId(Integer groupId)throws Exception{
        attributeConfigService.delConfigByGroupId(groupId);
        return Result.success("通过属性组id删除属性组、属性绑定成功",null);
    }

    /**
     * 通过属性id删除属性组、属性绑定
     * @param attributeId 属性id
     * @return
     * @throws Exception
     */
    @ApiOperation("通过属性id删除属性组、属性绑定")
    @ApiImplicitParam("属性id")
    @GetMapping("/delConfigByAttrId")
    @Permission(roles = {"超级管理员","管理员"})
    public Result delConfigByAttrId(Integer attributeId)throws Exception{
        attributeConfigService.delConfigByAttrId(attributeId);
        return Result.success("通过属性id删除属性组、属性绑定成功",null);
    }

    /**
     * 通过id修改属性组、属性绑定
     * @param form 修改属性组属性配置对象
     * @return 属性组属性配置dto对象
     * @throws Exception
     */
    @ApiOperation("通过id修改属性组、属性绑定")
    @ApiResponses({
            @ApiResponse(code = 200,message = "OK",response = AttrConfigDto.class)
    })
    @PostMapping("/updateAttrConfigById")
    @Permission(roles = {"超级管理员","管理员"})
    public Result updateAttrConfigById(@RequestBody UpdateAttrConfigForm form)throws Exception{
        AttrConfigDto dto = attributeConfigService.updateAttrConfigById(BeanUtil.toBean(form, UpdateAttrConfigParam.class));
        return Result.success("通过id修改属性组、属性绑定成功",dto);
    }

    /**
     * 通过属性组id修改绑定属性
     * @param form 新增属性组属性配置对象
     * @return 属性组属性配置dto对象集合
     * @throws Exception
     */
    @ApiOperation("通过属性组id修改绑定属性")
    @ApiResponses({
            @ApiResponse(code = 200,message = "OK",response = AttrConfigDto.class)
    })
    @PostMapping("/updateConfigByGroupId")
    @Permission(roles = {"超级管理员","管理员"})
    public Result updateConfigByGroupId(@RequestBody AddAttrConfigForm form)throws Exception{
        List<AttrConfigDto> dtos = attributeConfigService.updateConfigByGroupId(BeanUtil.toBean(form, AddAttrConfigParam.class));
        return Result.success("通过属性组id修改绑定属性成功",dtos);
    }

    /**
     * 通过id查找属性组、属性绑定
     * @param id 属性组属性绑定信息id
     * @return 属性组属性配置dto对象
     * @throws Exception
     */
    @ApiOperation("通过id查找属性组、属性绑定")
    @ApiImplicitParam("属性组属性绑定信息id")
    @GetMapping("/findAttrConfigById")
    @ApiResponses({
            @ApiResponse(code = 200,message = "OK",response = AttrConfigDto.class)
    })

    public Result findAttrConfigById(Integer id)throws Exception{
        AttrConfigDto dto = attributeConfigService.findAttrConfigById(id);
        return Result.success("通过id查找属性组、属性绑定成功",dto);
    }

    /**
     * 通过属性组id查找属性组、属性绑定
     * @param groupId 属性组id
     * @return 属性组属性绑定信息集合
     * @throws Exception
     */
    @ApiOperation("通过属性组id查找属性组、属性绑定")
    @ApiImplicitParam("属性组id")
    @ApiResponses({
            @ApiResponse(code = 200,message = "OK",response = AttrConfigDto.class)
    })
    @GetMapping("/findConfigByGroupId")

    public Result findConfigByGroupId(Integer groupId)throws Exception{
        List<AttrConfigDto> dtos = attributeConfigService.findConfigByGroupId(groupId);
        return Result.success("通过属性组id查找属性组、属性绑定成功",dtos);
    }

    /**
     * 通过属性id查找属性组、属性绑定
     * @param attributeId 属性id
     * @return 属性组属性绑定信息集合
     * @throws Exception
     */
    @ApiOperation("通过属性id查找属性组、属性绑定")
    @ApiImplicitParam("属性id")
    @ApiResponses({
            @ApiResponse(code = 200,message = "OK",response = AttrConfigDto.class)
    })
    @GetMapping("/findConfigByAttrId")

    public Result findConfigByAttrId(Integer attributeId)throws Exception{
        List<AttrConfigDto> dtos = attributeConfigService.findConfigByAttrId(attributeId);
        return Result.success("通过属性id查找属性组、属性绑定成功",dtos);
    }

    /**
     * 通过属性组类别id查找属性
     * @param id 属性组类别id
     * @return 属性信息集合
     * @throws Exception
     */
    @ApiOperation("通过属性组类别id查找属性")
    @ApiImplicitParam("属性组类别id")
    @ApiResponses({
            @ApiResponse(code = 200,message = "OK",response = AttrConfigDto.class)
    })
    @GetMapping("/findConfigById")

    public Result findConfigById(Integer id)throws Exception{
        List<AttrInfoDto> dtos = attributeConfigService.findConfigById(id);
        return Result.success("通过属性组类别id查找属性成功",dtos);
    }

}

